//
//  TSCMyUIUtil.m
//  Tsc_IOS
//
//  Created by Rio on 15-5-8.
//  Copyright (c) 2015年 idream. All rights reserved.
//

#import "TSCSDK.h"
#import "TSCVCLogin.h"
#import "TSCAppDelegate.h"
#import "TSCVCReg2Welcome.h"
#import "TSCVCCustomerMain.h"
#import "TSCVCGuideMain.h"
#import "TSCVCStory.h"
#import "TSCVCWelcome.h"
#import "TSCVCCustomerSpace.h"
#import "TSCVCGuideSpace.h"

@implementation TSCMyUIUtil

/**
 * 根据资源key弹出提示信息
 *
 * @date 2015-05-09
 * @author Rio
 */
+ (void) popErrWithResourceKey:(NSString *)resourceKey {
    [TSCMyToast makeTextWithResourceKey:resourceKey ti:CONFIG_TOAST_IT_S];
}

/**
 * 根据string内容弹出提示信息
 *
 * @date 2015-05-09
 * @author Rio
 */
+ (void) popErrWithString:(NSString *)string {
    [TSCMyToast makeTextWithString:string ti:CONFIG_TOAST_IT_S];
}

/**
 * 登录后界面的转发。因为在VCWelcome与VCLogin中都用到了，所以封装起来。
 *
 * @date 2015-05-11
 * @author Rio
 */
+ (void) dispatchLoginUIWithVC:(UIViewController *)viewController ud:(NSUserDefaults *)ud additionalTagArray:(NSArray *)additionalTagArray {
    
    // 如果配置文件不存在，读取之
    if (ud == nil) {
        ud = [NSUserDefaults standardUserDefaults];
    }
    NSString * udLoginKey = [ud stringForKey:UD_LOGIN_KEY];
    NSInteger udUserRole = [ud integerForKey:UD_USER_ROLE];
    
    // 如果没有loginKey，则表示用户从未登录成功过
    if ([TSCMyUtil isStringEmpty:udLoginKey] == true) {
        // 进入Login
        // 方式一：通过xib为vc初始化界面
        //        TSCVCLogin * vcLogin = [TSCVCLogin vcLogin];
        //        TSCVCLogin * vcLogin = [[TSCVCLogin alloc]init];// 注：错误！不能用alloc init，只能用initWithNibName，否则将显示黑屏
        // 方式二：使用Storyboard中的vc为vc初始化界面。注：需给Storyboard中的每一个vc指定id
        
        TSCVCLogin *vcLogin = [TSCVCLogin vcLoginWithStoryboard];
        [[viewController navigationController] pushViewController:vcLogin animated:YES];
        
        // 延迟替换根
        //        [TSCMyUIUtil delayReplaceAppDelegateRootViewWithNewVC:vcLogin completionHandler:nil];
        
        // 注：本来想改“延迟替换根”为立即替换根，但是发现只会立即push，而没有动画效果，所以放弃
        //        // 创建新nvc
        //        UINavigationController * nvControllerNew = [[UINavigationController alloc]init];
        //        // 替换根
        //        TSCAppDelegate * appDelegate = [[UIApplication sharedApplication]delegate];
        //        appDelegate.window.rootViewController = nvControllerNew;
        //        // push新vc
        //        TSCVCLogin *vcLogin = [TSCVCLogin vcLoginWithStoryboard];
        //        [nvControllerNew pushViewController:vcLogin animated:YES];
    }
    // 用户曾成功登录过，直接进入主界面
    else {
        // 判断用户是否已经完善注册信息
        // 用户仅完成注册1，没有进行注册2
        if (udUserRole != DB_USER_ROLE_CUSTOMER && udUserRole != DB_USER_ROLE_GUIDE) {
            // 开启注册2的Activity
            TSCVCReg2Welcome * vcReg2Welcome = [TSCVCReg2Welcome vcReg2WelcomeWithStoryboard];
            [[viewController navigationController]pushViewController:vcReg2Welcome animated:YES];
        }
        // 注册1、注册2均已完成了
        else {
            
            NSLog(@"TODO 百度云推注册！！");
            NSLog(@"TODO 百度云推注册！！");
            NSLog(@"TODO 百度云推注册！！");
            NSLog(@"TODO 百度云推注册！！");
            
            //            // TODO（1）注册云推送服务，都已经注册完毕则绑定云推送服务器
            //            MyPushUtils.bindBaiduPush(activity, spUserRole,
            //                                      additionalTagList, true);
            
            // （2）通知服务器，用户正在尝试登录，并在Server端记录诸如用户登录成功等信息
            [self noticeServerLogin_PP1:ud];
            
            // （3）判断是否需要开启我们的故事
            // 注：这一步放在vcCustomerMain、vcGuideMain中，通过presentViewController()的方法进行了。详细设计及原因说明，请参考IOS的Readme.doc
            BOOL isPopStory = ! [ud boolForKey:UD_HAS_APP_BEEN_OPENED_BEFORE]; // 进入首界面后，是否需要弹出“我们的故事”
            // 从未进入过app，更新“APP曾被打开过”的sp标识位
            if (isPopStory == YES) {
                [ud setBool:YES forKey:UD_HAS_APP_BEEN_OPENED_BEFORE];
                [ud synchronize];
            }
            
            // （4）打开首界面
            // 顾客
            if (udUserRole == DB_USER_ROLE_CUSTOMER) {
                TSCVCCustomerMain * vcCustomerMain = [TSCVCCustomerMain vcCustomerMainWithStoryboard];
                [viewController.navigationController pushViewController:vcCustomerMain animated:YES];
                
                // 告诉首界面，需要弹出“我们的故事”
                if (isPopStory) {
                    NSDictionary * inputDic = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AEKI_IS_POP_STORY];
                    [[NSNotificationCenter defaultCenter]addObserver:vcCustomerMain selector:@selector(SELECTOR_GET_VC_INPUT) name:UI_VC_NAME_CUSTOMER_MAIN object:nil];
                    [[NSNotificationCenter defaultCenter] postNotificationName:UI_VC_NAME_CUSTOMER_MAIN object:inputDic];
                }
            }
            // 导购
            else {
                TSCVCGuideMain * vcGuideMain = [TSCVCGuideMain vcGuideMainWithStoryboard];
                [viewController.navigationController pushViewController:vcGuideMain animated:YES];
                
                // 告诉首界面，需要弹出“我们的故事”
                if (isPopStory) {
                    NSDictionary * inputDic = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AEKI_IS_POP_STORY];
                    [[NSNotificationCenter defaultCenter]addObserver:vcGuideMain selector:@selector(SELECTOR_GET_VC_INPUT) name:UI_VC_NAME_GUIDE_MAIN object:nil];
                    [[NSNotificationCenter defaultCenter] postNotificationName:UI_VC_NAME_GUIDE_MAIN object:inputDic];
                }
            }
        }
    }
}

/* private */ + (void) noticeServerLogin_PP1:(NSUserDefaults *)ud {
    
    // 检查网络环境
    if([TSCMyNetworkUtil checkNetwork] == false) {
        NSLog(@"[W]%s网络不可用！", __FUNCTION__);
        return;
    };
    
    // 拼装请求
    NSMutableDictionary * reqDic = [[NSMutableDictionary alloc] init];
    [reqDic setObject:[ud stringForKey:UD_USER_ID] forKey:@"user_id"];
    [reqDic setObject:[ud stringForKey:UD_LOGIN_KEY] forKey:@"login_key"];
    
    // 发送请求
    [TSCMyHttpUtil postWithUrl:URL_USER_UPDATE_LAST_LOGIN dictionary:reqDic completionHandler:^(ServerRespType serverRespType, NSString * respString, NSDictionary *respDictionary, NSInteger code, NSString *msg, NSDictionary *contentDictionary) {
        // 服务器返回错误处理
        switch (serverRespType) {
            case ServerRespTypeSuccess:
                break;
            case ServerRespTypeErrNil:
            case ServerRespTypeErrJson: {
                [TSCMyUIUtil popErrWithResourceKey:@"err_web_server_unavailable"];
                return;
            }
            case ServerRespTypeErrCode:{
                [TSCMyUIUtil popErrWithString:msg];
                return;
            }
            default:
                [TSCMyUIUtil popErrWithResourceKey:@"err_system"];
                return;
        }
        
        // 如果更新成功
        // do nothing
    }];
}

/**
 * 延迟替换根。使用场景：假设有以下ViewController：A->B->C->D，当从D退到B后，需要废弃A，而将B作为新的根时，可以使用该方法。
 *
 * 一般在使用该方法前，都会进行vc跳转，而这些跳转都是带有动画的，所以需要延迟（比如1秒）避免动画失效，vc切换方法没有提供动画完毕后的回调，所以只能手工在异步线程中等待。
 *
 * 当AppDelegate的根vc被替换掉后，将导致当前界面重新显示（某些TextField将失去焦点），所以一般延迟等待的时间不会太长，以便在用户和界面交互前，就能替换完成。
 *
 * @date 2015-05-11
 * @author Rio
 */
//+ (void) delayReplaceAppDelegateRootViewWithNewVC:(UIViewController *)newViewController completionHandler:(void (^)(UINavigationController * newNavigationController))completionHandler {
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        [NSThread sleepForTimeInterval:CONFIG_REPLACE_ROOT_VIEW_S];
//
//        dispatch_async(dispatch_get_main_queue(), ^{
//            // 创建新nvc
//            UINavigationController * nvControllerNew = [[UINavigationController alloc]initWithRootViewController:newViewController];
//            nvControllerNew.navigationBarHidden = YES; // 默认情况下，新的nvc都隐藏顶部导航栏。如需要显示，在completionHandler中处理（不能在vc的viewDidLoad()中处理，否则新nvc的导航栏将依然是隐藏状态）
//
//            // 保存旧nvc
//            TSCAppDelegate * appDelegate = [[UIApplication sharedApplication]delegate];
//            UINavigationController * nvControllerOld = (UINavigationController *)[appDelegate.window rootViewController];
//
//            // 替换新nvc
//            appDelegate.window.rootViewController = nvControllerNew;
//
//            NSLog(@"[D]%s，替换window.rootViewController完成[旧：%@，新：%@]", __FUNCTION__, nvControllerOld, nvControllerNew);
//
//            // 执行完成后的回调
//            // 使用场景：旧nvc中已经设置了某些属性（比如NavigationBar的title等），当旧nvc被替换掉后，新nvc需要重新设置一遍
//            if (completionHandler) {
//                completionHandler(nvControllerNew);
//            }
//        });
//    });
//}


/**
 * 设置iv为某个用户的头像。如果用户没有上传自己的头像，则设置为默认头像
 *
 * @date 2015-05-14
 * @author Rio
 */
+ (void) setUserPicIvWithUserOrEmail:(NSString *)userNameOrEmail imageView:(UIImageView *)imageView isUseDefaultPic:(BOOL)isUseDefaultPic onSuccess:(void (^)())onSuccess onFailure:(void (^)())onFailure {
    
    // 从APP_DB中读取用户头像
    NSDictionary * user = [TSCMyDBUtil getRUserWithNameOrEmail_1:userNameOrEmail];
    if(user != nil) {
        [imageView sd_setImageWithURL:[NSURL URLWithString:[user objectForKey:@"pic_url"]] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
            
            // 内存缓存、本地文件、网络上均没有图片时，error不为nil
            if(error) {
                NSLog(@"[E]%s图片设置错误！错误信息：%@", __FUNCTION__, error);
                
                // 使用默认头像
                if(isUseDefaultPic == true) {
                    [imageView setImage:[UIImage imageNamed:@"ic_user_320x320.png"]];
                } else {
                    // do nothing
                }
                
                if (onFailure) {
                    onFailure();
                }
            } else {
                if (onSuccess) {
                    onSuccess();
                }
            }
        }];
    } else {
        // 使用默认头像
        if(isUseDefaultPic == true) {
            [imageView setImage:[UIImage imageNamed:@"ic_user_320x320.png"]];
        } else {
            // do nothing
        }
        
        if (onFailure) {
            onFailure();
        }
    }
    
}

/**
 * 设置iv为某个用户的头像。如果用户没有上传自己的头像，则设置为默认头像
 *
 * @date 2015-09-22
 * @author Rio
 */
+ (void) setUserPicIvWithUserPicUrl:(NSString *)userPicUrl imageView:(UIImageView *)imageView isUseDefaultPic:(BOOL)isUseDefaultPic onSuccess:(void (^)())onSuccess onFailure:(void (^)())onFailure {
    
    [imageView sd_setImageWithURL:[NSURL URLWithString:userPicUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        
        // 内存缓存、本地文件、网络上均没有图片时，error不为nil
        if(error) {
            NSLog(@"[E]%s图片设置错误！错误信息：%@", __FUNCTION__, error);
            
            // 使用默认头像
            if(isUseDefaultPic == true) {
                [imageView setImage:[UIImage imageNamed:@"ic_user_320x320.png"]];
            } else {
                // do nothing
            }
            
            if (onFailure) {
                onFailure();
            }
        } else {
            if (onSuccess) {
                onSuccess();
            }
        }
    }];
    
}


/**
 * 设置UIView的frame，如果某项不用设置，传-1。该方法方便仅设置frame中的个别项。
 *
 * @date 2015-06-03
 * @author Rio
 */
+ (void) setUIRect:(UIView *)view x:(CGFloat)x y:(CGFloat)y w:(CGFloat)w h:(CGFloat)h {
    CGFloat x0 = view.frame.origin.x;
    CGFloat y0 = view.frame.origin.y;
    CGFloat w0 = view.frame.size.width;
    CGFloat h0 = view.frame.size.height;
    
    view.frame = CGRectMake(x > -1 ? x : x0, y > -1 ? y : y0, w > -1 ? w : w0, h > -1 ? h : h0);
}

/**
 * 设置UIView的圆角矩形背景。比如：设置MyDialog的圆角背景
 *
 * @date 2015-05-26
 * @author Rio
 */
+ (void) setUIRoundRectBG:(UIView *)view radius:(CGFloat)radius {
    // 方法一：已废弃。因为这种方法只会静态地添加一次，如果是给LinerLayout添加圆角边框，当LinerLayout宽高发生变化时，这种方法就失效了
    //    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(radius, radius)];
    //    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    //    maskLayer.frame = view.bounds;
    //    maskLayer.path = maskPath.CGPath;
    //    view.layer.mask = maskLayer;
    
    // 方法二：
    view.layer.masksToBounds = YES; // 这个属性告诉layer位于其下方所有其他的layer都将被遮盖，这样能保证圆角不被下方同色的layer覆盖。但这样将导致如果再添加阴影，将无法显示阴影（因为这个属性，阴影被遮盖掉了）
    view.layer.cornerRadius = radius;
    view.layer.borderWidth = -1; // 因为如果为正数，border将添加在view内部，可能会覆盖内部元素。所以改为-1。比如给dialog添加圆角时
    view.layer.borderColor = [view.backgroundColor CGColor]; // 使用同view背景色相同的颜色
    
    //    // 方法三：
    // 注：该方法废弃，因为方法三无法支持view的约束，就无法确定sublayer的center、bounds
    //    // 因为方法二将导致无法与同样添加在layer上的阴影同用，所以使用方法三
    //    // 参考：http://stackoverflow.com/questions/3316424/cant-add-a-corner-radius-and-a-shadow
    //    CALayer * subLayer = [[CALayer alloc]init];
    //    [subLayer setBounds:CGRectMake(0.0f, 0.0f, 500, 200)];
    //    [subLayer setPosition:[view center]];
    //    subLayer.cornerRadius = 8;
    //    subLayer.borderWidth = 1;
    //    subLayer.borderColor = [view.backgroundColor CGColor];
    //    [view.layer addSublayer:subLayer];
}

/**
 * 设置UIView的圆角矩形边框。比如：设置MySpinner的圆角边框
 *
 * @date 2015-05-26
 * @author Rio
 */
+ (void) setUIRoundBorder:(UIView *)view radius:(CGFloat)radius borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth {
    CALayer * downButtonLayer = [view layer];
    [downButtonLayer setMasksToBounds:YES];
    [downButtonLayer setCornerRadius:radius];
    [downButtonLayer setBorderWidth:borderWidth];
    [downButtonLayer setBorderColor:[borderColor CGColor]];
}

+ (void) setUIImageViewRounded:(UIImageView *)iv {
    iv.image = [TSCMyImageUtil getRoundImage:iv.image inset:0.0f borderWidth:0.0f borderColor:nil];
}

/**
 * 添加默认阴影效果
 *
 * @date 2015-09-26
 * @author Rio
 */
+ (void) setUIShadow:(UIView *)view {
    [[view layer] setShadowColor:[UIColor grayColor].CGColor]; // 阴影的颜色
    [[view layer] setShadowOffset:CGSizeMake(0, 0)]; // 阴影的范围(0, 0)
    [[view layer] setShadowRadius:5];                // 阴影扩散的范围控制(默认：5)
    [[view layer] setShadowOpacity:1];               // 阴影透明度(默认：1)
}

/**
 * 给某个UI元素添加icon。比如给“选择性”的TextField添加右侧小三角
 *
 * 注：如果将同一个icon多次添加到view中，则只会显示一个icon，因为传入同一个icon，只是icon.frame的变化
 *
 * @date 2015-06-01
 * @author Rio
 */
+ (void) addIconToView:(UIView *)view icon:(UIView *)icon direction:(IconDirection)direction {
    // 方法二：使用约束添加icon
    // 先保存原有宽高，因为使用了约束，所以宽高要重新设置
    CGFloat iconW = icon.frame.size.width;
    CGFloat iconH = icon.frame.size.height;
    
    [view addSubview:icon]; // 添加到父view。注：必须在添加约束前进行，否则将报错：Thread 1: signal SIGABRT
    icon.translatesAutoresizingMaskIntoConstraints = NO; // 放弃原有布局方式
    
    switch (direction) {
        case IconDirectionLeft: {
            // y轴居中
            [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f].active = YES;
            // left
            [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeLeft multiplier:1.0f constant:UI_ICON_PADDING].active = YES;
            
            break;
        }
        case IconDirectionTop: {
            // x轴居中
            [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f].active = YES;
            // top
            [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTop multiplier:1.0f constant:UI_ICON_PADDING].active = YES;
            
            break;
        }
        case IconDirectionRight: {
            // y轴居中
            [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f].active = YES;
            // right
            [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeRight multiplier:1.0f constant:-UI_ICON_PADDING].active = YES;
            
            break;
        }
        case IconDirectionBottom: {
            // x轴居中
            [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f].active = YES;
            // bottom
            [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:-UI_ICON_PADDING].active = YES;
            
            break;
        }
            
        default:
            break;
    }
    
    // 将宽高恢复为icon原有的宽高
    // width
    [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:iconW].active = YES;
    // height
    [NSLayoutConstraint constraintWithItem:icon attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:iconH].active = YES;
    
    
    // 方法一：通过设置位置向当前vc添加icon。已废弃，缺点是无法SizeClasses
    //    // 获得当前vc
    //    UIViewController * currentVC = [TSCMyUtil getCurrentViewController];
    //
    //    // 将目标view的相对坐标，转换为绝对坐标
    //    CGRect rf = view.frame;
    //    CGRect af = [view.superview convertRect:rf toView:currentVC.view];
    //
    //    // 设置icon中心点
    //    switch (direction) {
    //        case IconDirectionLeft: {
    //            icon.center = CGPointMake(af.origin.x + UI_ICON_PADDING + icon.frame.size.width / 2, af.origin.y + af.size.height / 2);
    //            break;
    //        }
    //        case IconDirectionTop: {
    //            icon.center = CGPointMake(af.origin.x + af.size.width / 2, af.origin.y + UI_ICON_PADDING + icon.frame.size.height / 2);
    //            break;
    //        }
    //        case IconDirectionRight: {
    //            icon.center = CGPointMake(af.origin.x + af.size.width - UI_ICON_PADDING - icon.frame.size.width / 2, af.origin.y + af.size.height / 2);
    //            break;
    //        }
    //        case IconDirectionBottom:{
    //            icon.center = CGPointMake(af.origin.x + af.size.width / 2, af.origin.y + af.size.height - UI_ICON_PADDING - icon.frame.size.height / 2);
    //            break;
    //        }
    //            // 其他情况同right
    //        default:{
    //            icon.center = CGPointMake(af.origin.x + af.size.width - UI_ICON_PADDING - icon.frame.size.width / 2, af.origin.y + af.size.height / 2);
    //            break;
    //        }
    //    }
    //
    //
    //    // 将icon添加到当前window
    //    [currentVC.view addSubview:icon];
}

/**
 * 给某个UI元素添加向下的小三角。比如给“选择性”的TextField添加右侧小三角
 *
 * 注：如果将同一个icon多次添加到view中，则只会显示一个icon，因为传入同一个icon，只是icon.frame的变化
 *
 * @date 2015-06-01
 * @author Rio
 */
+ (UIImageView *) addDownTriangleIconToView:(UIView *)view direction:(IconDirection)direction {
    UIImageView * ivIcon = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"ic_down_triangle_96x96.png"]];
    ivIcon.bounds = CGRectMake(0, 0, 10, 10); // 设置icon宽高
    
    [self addIconToView:view icon:ivIcon direction:direction];
    
    return ivIcon;
}

/**
 * 创建并获得水平（宽的）分隔线，用来分隔垂直布局的各UI元素
 *
 * @date 2015-06-17
 * @author Rio
 */
// TODO delete
//+ (UIView *) createHLSInView:(UIView *)view {
//    TSCLinerLayout * hls = [[TSCLinerLayout alloc]init];
//    hls.orientation = LinerLayoutOrientationHorizontal;
//    hls.layoutWidth = LayoutWHTypeMatchParent;
//    hls.layoutHeight = LayoutWHTypeNone;
//    hls.frame = CGRectMake(0, 0, 0, 1);
//    hls.backgroundColor = COLOR_MT;
//    return hls;
//}

/**
 * 创建并获得垂直（高的）分隔线，用来分隔水平布局的各UI元素
 *
 * @date 2015-06-18
 * @author Rio
 */
//+ (TSCLinerLayout *) createVLS {
//    TSCLinerLayout * vls = [[TSCLinerLayout alloc]init];
//    vls.orientation = LinerLayoutOrientationVertical;
//    vls.layoutWidth = LayoutWHTypeNone;
//    vls.layoutHeight = LayoutWHTypeMatchParent;
//    vls.frame = CGRectMake(0, 0, 1, 0);
//    vls.backgroundColor = COLOR_MT;
//    return vls;
//}

/**
 * 创建并获得水平（宽的）padding分隔符，用来分隔垂直布局的各UI元素
 *
 * @date 2015-06-29
 * @author Rio
 */
//+ (TSCLinerLayout *) createHP:(CGFloat)padding {
//    TSCLinerLayout * llPadding = [[TSCLinerLayout alloc]init];
//    llPadding.orientation = LinerLayoutOrientationHorizontal;
//    llPadding.layoutWidth = LayoutWHTypeMatchParent;
//    llPadding.layoutHeight = LayoutWHTypeNone;
//    [TSCMyUIUtil setUIRect:llPadding x:-1 y:-1 w:-1 h:5]; // 仅设置高度
//
//    return llPadding;
//}

/**
 * 创建并获得垂直（高的）padding分隔符，用来分隔水平布局的各UI元素
 *
 * @date 2015-06-29
 * @author Rio
 */
//+ (TSCLinerLayout *) createVP:(CGFloat)padding {
//    TSCLinerLayout * llPadding = [[TSCLinerLayout alloc]init];
//    llPadding.orientation = LinerLayoutOrientationVertical;
//    llPadding.layoutWidth = LayoutWHTypeNone;
//    llPadding.layoutHeight = LayoutWHTypeMatchParent;
//    [TSCMyUIUtil setUIRect:llPadding x:-1 y:-1 w:5 h:-1]; // 仅设置宽度
//
//    return llPadding;
//}

/**
 * 以某个尺寸创建一个占位符，并将传入的UIView居中放置
 *
 * @date 2015-09-07
 * @author Rio
 */
+ (UIView *) addVacancyWithW:(CGFloat)width H:(CGFloat)height forView:(UIView *)forView inView:(UIView *)inView {
    // 参数检查
    CGFloat vw = forView.frame.size.width;
    CGFloat vh = forView.frame.size.height;
    
    if (vw == 0 || vh == 0) {
        NSLog(@"[W]%s: 创建占位符view时，被居中的view[%@]没有宽度[%f]/高度[%f]，可能导致该view无法正常显示！", __FUNCTION__, forView, vw, vh);
    }
    
    NSAssert(width >= vw, @"[E]%s: 创建占位符view时，占位符的宽度[%f]不能小于被居中view[%@]的宽度[%f]！", __FUNCTION__, width, forView, vw);
    NSAssert(height >= vh, @"[E]%s: 创建占位符view时，占位符的高度[%f]不能小于被居中view[%@]的高度[%f]！", __FUNCTION__, height, forView, vh);
    
    // 创建占位符view
    //    UIView * vacancy = [[UIView alloc]initWithFrame:CGRectMake(0, 0, width, height)]; // 以指定宽高创建占位符view，但不指定x、y
    UIView * vacancy = [[UIView alloc]init];
    vacancy.frame = CGRectMake(0, 0, width, height);
    [vacancy addSubview:forView];
    [inView addSubview:vacancy];
    
    // 约束
    // forView
    forView.translatesAutoresizingMaskIntoConstraints = NO;
    [NSLayoutConstraint constraintWithItem:forView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:vacancy attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f].active = YES;
    [NSLayoutConstraint constraintWithItem:forView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:vacancy attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f].active = YES;
    [NSLayoutConstraint constraintWithItem:forView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:vw].active = YES;
    [NSLayoutConstraint constraintWithItem:forView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:vh].active = YES;
    
    return vacancy;
}

/**
 * 设置UILabel一部分字体颜色
 *
 * @date 2015-10-15
 * @author Rio
 */
+ (void) changeLabelColorWithLabel:(UILabel *)label color:(UIColor *)color range:(NSRange)range {
    NSString * text = label.text;
    NSMutableAttributedString * as = [[NSMutableAttributedString alloc]initWithString:text];
    [as addAttribute:NSForegroundColorAttributeName value:color range:range];
    label.attributedText = as;
}

/**
 * 获得系统默认字体
 *
 * @date 2015-06-03
 * @author Rio
 */
+ (UIFont *) getSystemDefaultFont {
    // 创建一个系统默认风格的按钮，取按钮文字的字体
    return [[UIButton buttonWithType:UIButtonTypeSystem] titleLabel].font;
}

/**
 * 获得屏幕最上方状态栏frame
 *
 * @date 2015-08-12
 * @author Rio
 * @return 如果statusBar是隐藏的，返回CGRectZero
 */
+ (CGRect) getStatusBarFrame {
    return [[UIApplication sharedApplication] statusBarFrame];
}

/**
 * 获得屏幕上方导航栏frame
 *
 * @date 2015-08-12
 * @author Rio
 * @return 如果statusBar是隐藏的，返回CGRectZero
 */
+ (CGRect) getNavigationBarFrame:(UIViewController *)vc {
    if (vc.navigationController) {
        if (vc.navigationController.navigationBar) {
            return vc.navigationController.navigationBar.frame;
        }
    }
    return CGRectZero;
}

/**
 * 判断当前屏幕是否为垂直
 *
 * @date 2015-09-04
 * @author Rio
 */
+ (ScreenOrientation) getScreenOrientationNow {
    return UI_SCREEN_WIDTH <= UI_SCREEN_HEIGHT ? ScreenOrientationVertical : ScreenOrientationHorizontal;
    
    // 注：不要用以下方法判断，试验过，如果通过这种方法判断，在viewDidLoad()中调用此方法，会获得UIDeviceOrientationUnknown
    // return UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation);
}

/**
 * 从nvc.viewControllers中，找到某层vc。比如：A->B->C->D，然后需要从D直接跳转至B，这时就需要找到B
 *
 * @date 2015-09-10
 * @author Rio
 */
+ (UIViewController *) getAncestorVCofVC:(UIViewController *)vc byClass:(Class)Class {
    NSArray * vcArr = vc.navigationController.viewControllers;
    for (UIViewController * vc in vcArr) {
        if ([vc isKindOfClass:Class]) {
            return vc;
        }
    }
    
    // 如果没找到，直接挂掉
    NSAssert(YES == NO, @"[E]%s: 在nvc中所有的vc中，找不到Class类型为%@的vc！", __FUNCTION__, Class);
    return nil;
}

/**
 * 关闭界面，及其可能包含的dialog。使用场景：比如注册成功后，dialog显示server返回“注册成功”，然后需要同时关闭界面及dialog
 *
 * @date 2015-05-19
 * @author Rio
 */
+ (void) popVCLaterWithNVC:(UINavigationController *)nvc animated:(BOOL)animated {
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [NSThread sleepForTimeInterval:CONFIG_MY_DIALOG_CLOSE_S];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [nvc popViewControllerAnimated:animated];
        });
    });
    
}

/**
 * 从nvc.viewControllers中，找到某层vc，并删除它。比如：A->B->C->D，然后删除C，变成：A->B->D。
 *
 * 注：该方法必须在pushViewController()之后调用，即调用前需保证vc.viewControllers中至少有一个vc，否则将导致黑屏
 *
 * @date 2015-09-16
 * @author Rio
 */
+ (void) removeVCOfVC:(UIViewController *)vcToBeRemoved {
    NSArray * vcArr = vcToBeRemoved.navigationController.viewControllers;
    UIViewController * vcToBeRemoved2 = nil;
    for (UIViewController * vc in vcArr) {
        if (vc == vcToBeRemoved) {
            vcToBeRemoved2 = vc;
            break;
        }
    }
    
    // 如果没找到，直接挂掉
    NSAssert(vcToBeRemoved2 != nil, @"[E]%s: 在nvc中所有的vc中[]，找不到将要被删除的vc[%@]！", __FUNCTION__, vcArr, vcToBeRemoved);
    
    // 删除找到的vc
    NSMutableArray * vcArr2 = [NSMutableArray arrayWithArray:vcArr];
    [vcArr2 removeObject:vcToBeRemoved2];
    
    // 替换原来的vcArr
    vcToBeRemoved.navigationController.viewControllers = vcArr2;
}

/**
 * 从nvc.viewControllers中，找到某层vc，删除它及其之前所有的vc。比如A->B->C->D，然后删除A、B、C，最后得到D。
 *
 * 注：该方法必须在pushViewController()之后调用，即调用前需保证vc.viewControllers中至少有一个vc，否则将导致黑屏
 *
 * @date 2015-09-16
 * @author Rio
 */
+ (void) removeVCItselfAndAllPreviousVC:(UIViewController *)vcToBeRemoved {
    NSArray * vcArr = vcToBeRemoved.navigationController.viewControllers;
    UIViewController * vcToBeRemoved2 = nil;
    NSInteger i = 0;
    NSInteger max = [vcArr count];
    for (; i < max; i++) {
        UIViewController * vc = [vcArr objectAtIndex:i];
        if (vc == vcToBeRemoved) {
            vcToBeRemoved2 = vc;
            break;
        }
    }
    
    // 如果没找到，直接挂掉
    NSAssert(vcToBeRemoved2 != nil, @"[E]%s: 在nvc中所有的vc中[]，找不到将要被删除的vc[%@]！", __FUNCTION__, vcArr, vcToBeRemoved);
    
    // 删除找到的vc，及其之前全部的vc
    NSMutableArray * vcArr2 = [NSMutableArray arrayWithArray:vcArr];
    
    // 替换原来的vcArr
    vcToBeRemoved.navigationController.viewControllers = [vcArr2 subarrayWithRange:NSMakeRange(i + 1, max - (i + 1))];
}

/**
 * 以present方式弹出“我们的故事”
 *
 * @date 2015-09-19
 * @author Rio
 */
+ (void) popVCStoryWithVC:(UIViewController *)vc {
    
    // 进入我们的故事...
    // 注：进入故事的intent要比进入首界面的intent晚打开 // 注：IOS中不存在这个问题
    TSCVCStory * vcStory = [[TSCVCStory alloc]init];
    [vc presentViewController:vcStory animated:YES completion:nil];
    
    // VC间传递参数
    NSDictionary * inputDic = [NSDictionary dictionaryWithObjectsAndKeys:
                               [NSNumber numberWithInt:TSCStoryVersionBrief], AEKI_STORY_VERSION,
                               nil];
    [[NSNotificationCenter defaultCenter] addObserver:vcStory selector:@selector(SELECTOR_GET_VC_INPUT) name:UI_VC_NAME_STORY object:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:UI_VC_NAME_STORY object:inputDic];
    
}

/**
 * 删除某个view下的全部“直接”子view
 *
 * @date 2015-06-11
 * @author Rio
 */
+ (void) removeAllSubviews:(UIView *)view {
    for (UIView * sv in view.subviews) {
        [sv removeFromSuperview];
    }
}

/**
 * 添加约束：全屏占据父view
 *
 * @date 2015-09-28
 * @author Rio
 */
+ (NSArray *) addConstraintsFillParent2View:(UIView *)view isActiveImmediately:(BOOL)isActiveImmediately {
    NSMutableArray * ctArr = [NSMutableArray array];
    [ctArr addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];
    [ctArr addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];
    
    if (isActiveImmediately) {
        view.translatesAutoresizingMaskIntoConstraints = NO;
        [NSLayoutConstraint activateConstraints:ctArr];
    }
    
    return ctArr;
}


/**
 * 从一组RadioButton中找到被选中的那个。如果找不到，返回nil
 *
 * @date 2015-10-19
 * @author Rio
 */
+ (NikiRadioButton *) getSelectedRadioButton:(NSArray<NikiRadioButton *> *) rbg {
    for (NikiRadioButton * rb in rbg) {
        if (rb.selected) {
            return rb;
        }
    }
    
    return nil;
}


@end
